package com.syyo.gulimall.cart.config.thread;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * @ author: wang
 * @ date: 2021/4/15 10:37
 * @ Description:
 */
@Configuration
public class MyThreadConfig {

    /**
     * int corePoolSize, 核心线程数，只要线程池不销毁，就一直存在
     * int maximumPoolSize, 最大线程数量，控制资源并发
     * long keepAliveTime, 存活时间，如果当前线程数量大于核心数量
     *      释放空闲的线程（maximumPoolSize - corePoolSize），只要线程空闲时间大于这个值就会释放
     * TimeUnit unit, 时间单位
     * BlockingQueue<Runnable> workQueue, 阻塞队列，超过的任务会放在队列里等待，只要有线程空闲，就会去队列里取新的任务执行,默认是Integer的最大值
     * ThreadFactory threadFactory, 线程工程
     * RejectedExecutionHandler handler 如果队列满了，按照我们指定的拒绝策略来执行拒绝任务
     *
     * 工作流程
     *      1.线程池创建，准备好core线程，接收任务
     *      2.core线程满了，就将任务放到队列里
     *      3.如果workQueue阻塞队列满了，就会开启新的线程来执行任务（不能超过max线程数）
     *      4.如果max线程满了，就会使用指定的handler拒绝策略拒绝任务
     *      5.max线程数都执行完了，有很多空闲的，在指定的时间释放空闲的线程，释放后剩下的线程不能小于core线程数
     *
     */
    @Bean
    public ThreadPoolExecutor threadPoolExecutor(ThreadPoolConfigProperties pool){
        return new ThreadPoolExecutor(pool.getCoreSize(),
                pool.getMaxSize(),
                pool.getKeepAliveTime(),
                TimeUnit.SECONDS,
                new LinkedBlockingDeque<>(100000),
                Executors.defaultThreadFactory(),new ThreadPoolExecutor.AbortPolicy());

    }

}
